//
//  CircularDependency.hpp
//  learnC++
//
//  Created by liuzhibing on 2018/7/1.
//  Copyright © 2018年 yunfan.com. All rights reserved.
//

#ifndef CircularDependency_hpp
#define CircularDependency_hpp

#include <stdio.h>
#include <iostream>
#include <memory>

class Resource7 {
    
public:
    //wrong
//    std::shared_ptr<Resource7> m_ptr;
    //correct
    std::weak_ptr<Resource7> m_ptr;
    
    Resource7(){
        std::cout << "init\n";
    }
    
    ~Resource7(){
        std::cout << "dealloc\n";
    }
    //weak_ptr转share_ptr
    const std::shared_ptr<Resource7> getPtr() const{
        return m_ptr.lock();
    }
    
    void print(){
//        getPtr()->print();
    }
    
};

/*
 //循环引用
 auto ptr1 = std::make_shared<Resource7>();
 ptr1->m_ptr = ptr1;
 
 
 //使用std :: weak_ptr解决该问题
 std :: weak_ptr旨在解决上述“周期性所有权”问题。 std :: weak_ptr是观察者 - 它可以观察和访问与std :: shared_ptr（或其他std :: weak_ptrs）相同的对象，但它不被视为所有者。 请记住，当std :: shared指针超出范围时，它只会考虑其他std :: shared_ptr是否共同拥有该对象。 std :: weak_ptr不算数！
 
 
 使用std :: weak_ptr
 std :: weak_ptr的缺点是std :: weak_ptr不能直接使用（它们没有operator->）。 要使用std :: weak_ptr，必须先将其转换为std :: shared_ptr。 然后你可以使用std :: shared_ptr。 要将std :: weak_ptr转换为std :: shared_ptr，可以使用lock（）成员函数。
 */

/*
 auto ptr1 = std::make_shared<Resource7>();
 
 auto ptr2 = ptr1;
 
 ptr1.reset();
 
 ptr2.reset();
 */

#endif /* CircularDependency_hpp */
